const db = require('../models');
const FileMetadata = db.FileMetadata;
const path = require('path');
const { cos, cosConfig } = require('../config/cos.config');
const multer = require('multer');
const fs = require('fs');
const os = require('os');

// 使用内存存储而不是磁盘存储
const storage = multer.memoryStorage();
exports.upload = multer({ 
  storage,
  limits: {
    fileSize: 5 * 1024 * 1024 // 限制5MB
  }
});

// 更新或创建文件/文件夹元数据
exports.updateMetadata = async (req, res) => {
  try {
    const { cosKey, nickname, type } = req.body;
    
    // 检查是否是缩略图文件夹内的文件
    const isThumbnailFile = cosKey.includes('/thumbnail/') || cosKey.startsWith('thumbnail/');
    if (isThumbnailFile && req.file) {
      console.warn('检测到对缩略图文件夹内的文件上传缩略图，已阻止此操作以防止循环');
      return res.status(400).json({
        success: false,
        message: '不能为缩略图文件夹内的文件创建缩略图，这会导致无限循环'
      });
    }
    
    let thumbnailUrl = null;
    
    // 如果上传了缩略图
    if (req.file) {
      console.log('收到缩略图上传请求:', {
        cosKey,
        fileSize: req.file.size,
        mimeType: req.file.mimetype
      });
      
      // 从原始cosKey中提取文件夹路径
      const keyParts = cosKey.split('/');
      const fileName = keyParts[keyParts.length - 1];
      
      // 确定文件夹路径（去掉文件名）
      let folderPath = '';
      if (keyParts.length > 1) {
        folderPath = keyParts.slice(0, -1).join('/');
      }
      
      // 创建缩略图路径: 原文件夹/thumbnail/文件名.png
      const fileNameWithoutExt = path.parse(fileName).name;
      const thumbnailKey = folderPath 
        ? `${folderPath}/thumbnail/${fileNameWithoutExt}.png`
        : `thumbnail/${fileNameWithoutExt}.png`;
      
      // 上传到腾讯云COS
      try {
        const uploadResult = await cos.putObject({
          Bucket: cosConfig.Bucket,
          Region: cosConfig.Region,
          Key: thumbnailKey,
          Body: req.file.buffer,
          ContentType: 'image/png',
          // 设置为公开读
          ACL: 'public-read'
        });
        
        console.log('缩略图上传成功:', {
          thumbnailKey,
          uploadResult
        });
        
        // 设置缩略图URL为COS路径
        thumbnailUrl = thumbnailKey;
        
        // 生成永久URL方便前端直接访问
        const publicUrl = `https://${cosConfig.Bucket}.cos.${cosConfig.Region}.myqcloud.com/${encodeURIComponent(thumbnailKey)}`;
        
        console.log('缩略图永久URL:', publicUrl);
      } catch (uploadError) {
        console.error('缩略图上传失败:', uploadError);
        return res.status(500).json({
          success: false,
          message: '缩略图上传失败',
          error: uploadError.message
        });
      }
    }
    
    // 查找或创建元数据记录
    const [metadata, created] = await FileMetadata.findOrCreate({
      where: { cosKey },
      defaults: {
        nickname,
        thumbnailUrl,
        type: type || 'file'
      }
    });
    
    // 如果记录已存在，则更新
    if (!created) {
      const updateData = {};
      if (nickname) updateData.nickname = nickname;
      if (thumbnailUrl) updateData.thumbnailUrl = thumbnailUrl;
      if (type) updateData.type = type;
      
      await metadata.update(updateData);
    }
    
    res.json({
      success: true,
      message: created ? '元数据创建成功' : '元数据更新成功',
      data: metadata
    });
  } catch (error) {
    console.error('更新元数据失败:', error);
    res.status(500).json({ 
      success: false, 
      message: '更新元数据失败', 
      error: error.message 
    });
  }
};

// 获取指定对象的元数据
exports.getMetadata = async (req, res) => {
  try {
    const { cosKey } = req.params;
    
    const metadata = await FileMetadata.findOne({
      where: { cosKey }
    });
    
    if (!metadata) {
      return res.status(404).json({
        success: false,
        message: '未找到元数据'
      });
    }
    
    res.json({
      success: true,
      data: metadata
    });
  } catch (error) {
    console.error('获取元数据失败:', error);
    res.status(500).json({ 
      success: false, 
      message: '获取元数据失败', 
      error: error.message 
    });
  }
}; 